<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 方法一
        // function Person (name, age) {
        //   this.name = name
        //   this.age = age
        // }
        // Person.prototype.say = function () {
        //   console.log('hello')
        // }

        // function Gril (name, age) {
        //     Person.call(this, name, age)
        // }
        // Gril.prototype = new Person()
        // Gril.prototype.constructor = Gril
        // let chengguo  = new Gril('chengguo', 26)
        // console.log(chengguo)
        
        /* 以下推荐 */
        
        // 方法二
        // function inheritPrototype(parent, child) {
        //   const prototype = Object.create(parent.prototype)  // Object.create()方法创建一个新对象，使用现有的对象来提供新创建的对象的__proto__。
        //   prototype.constructor = child
        //   child.prototype = prototype
        // }
        // function Parent (name) {
        //   this.name = name
        // }
        // Parent.prototype.say = function () {
        //     alert(this.name)
        // }
        // function Child (name, age) {
        //   Parent.call(this, name)
        //   this.age = age
        // }
        // inheritPrototype(Parent, Child)
        // const person = new Child('chengguo', 26)
        // console.log(person);

        // 方法三
        // function Person (name) {
        //   this.name = name
        // }
        // Person.prototype.say = function () {
        //   console.log('zgdl')
        // }
        // function Girl (age) {
        //   this.age = age
        //   Person.call(this, 'chengguo')
        // }
        // Girl.prototype = Object.create(Person.prototype)
        // Girl.prototype.constructor = Girl
        // const chengguo = new Girl(26)
        // console.log(chengguo.__proto__ === Girl.prototype)  // true

        // 方法四
        // function Person (name) {
        //   this.name = name
        // }
        // Person.prototype.say = function () {
        //   console.log('hello');
        // }
        
        // function Girl (name, age) {
        //   Person.call(this, name)
        //   this.age = age
        // }

        // Object.setPrototypeOf(Girl.prototype, Person.prototype) // 方法设置一个指定的对象的原型 ( 即, 内部[[Prototype]]属性）到另一个对象或  null。
        // Girl.prototype.constructor = Girl

        // const chengguo = new Girl('chengguo', 26)
        // console.log(chengguo)

        // 方法五 es6 class
        // class Person {
        //   constructor (name) {
        //     this.name = name
        //   }
        //   say () {
        //     console.log('不, 是你的益达')
        //   }
        // }

        // const zhangwei = new Person('zhangwei')

        // class Girl extends Person {
        //   constructor (name, age) {
        //     super(name)
        //     this.age = age
        //   } 
        // }

        // const chengguo = new Girl('chengguo', 26)

    </script>
</body>
</html>